home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_pcdp / ada / bakery.ada < prev    next >
Text File  |  1996-01-30  |  2KB  |  69 lines

  1. with Text_IO; use Text_IO;
  2. procedure Bakery is
  3.  
  4.   pragma Time_Slice(0.01);
  5.  
  6.   type Node_Count is range 0..4;
  7.   subtype Node_ID is Node_Count range 1..Node_Count'Last;
  8.  
  9.   Choosing: array(Node_ID) of Integer range 0..1 := (others => 0);
  10.   Number:   array(Node_ID) of Integer := (others => 0);
  11.  
  12.   pragma Volatile(Choosing);
  13.   pragma Volatile(Number);
  14.  
  15.   task type Nodes is
  16.     entry Init(ID: Node_ID);
  17.   end Nodes;
  18.  
  19.   Node: array(Node_ID) of Nodes;
  20.  
  21.   function Max return Integer is
  22.     Current: Integer := 0;
  23.   begin
  24.     for N in Number'Range loop
  25.       if Number(N) > Current then
  26.         Current := Number(N);
  27.       end if;
  28.     end loop;
  29.     return Current;
  30.   end Max;
  31.  
  32.   task body Nodes is
  33.     I:           Node_ID;
  34.   begin
  35.     accept Init(ID: Node_ID) do
  36.       I := ID;
  37.     end Init;
  38.     for M in 1..5 loop
  39.       Put_Line(" " & Node_ID'Image(I) & " non-critical section" );
  40.       Choosing(I) := 1;
  41.       Put_Line(" " & Node_ID'Image(I) & " choosing");
  42.       Number(I) := 1 + Max;
  43.       Choosing(I) := 0;
  44.       Put_Line(" " & Node_ID'Image(I) & " number is " &
  45.          Integer'Image(Number(I)) );
  46.  
  47.       for J in Node_ID loop
  48.         if J /= I then
  49.           loop exit when Choosing(J) = 0; end loop;
  50.           loop
  51.                exit when 
  52.                  (Number(J) = 0) or (Number(I) < Number(J)) or
  53.                  (Number(I) = Number(J) and I < J);
  54.           end loop;
  55.         end if;
  56.       end loop;
  57.  
  58.       Put_Line(" " & Node_ID'Image(I) & " critical section");
  59.       Number(I) := 0;
  60.       Put_Line(" " & Node_ID'Image(I) & " left critical section");
  61.     end loop;
  62.   end Nodes;
  63.  
  64. begin
  65.   for J in Node_ID loop
  66.     Node(J).Init(J);
  67.   end loop;
  68. end Bakery;
  69.